﻿
namespace SistemaLogistica.Windows.Panels
{
    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using SistemaLogistica.Business.Entities;
    using SistemaLogistica.Business.Logic;
    using WeifenLuo.WinFormsUI.Docking;
    using WindowsControls.VB;

    public partial class FrmExplorer : FrmWindows
    {
        enum TipoItem
        {
            Modulo = 0,
            Carpeta = 1,
            Formulario = 2
        }

        public FrmExplorer()
        {
            InitializeComponent();
        }

        private void FrmExplorer_Load(object sender, EventArgs e)
        {
            if (DesignMode == false)
            {
                lblModulo.Text = string.Empty;
                LoadMenusFlexibles();
            }
        }

        private void TvwFormularios_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Node.ImageIndex == (int)TipoItem.Formulario)
            {
                byte id = (byte)e.Node.Tag;
                Formulario formulario = FormularioManager.Instancia.ObtenerPorID(id);
                FrmDocument frm = ObtenerFormulario(formulario);
                frm.Show(DockPanel);
            }
        }

        private void TvwFormularios_AfterSelect(object sender, TreeViewEventArgs e)
        {
            tvwFormularios.SelectedImageIndex = tvwFormularios.SelectedNode.ImageIndex;
        }

        private FrmDocument ObtenerFormulario(Formulario formulario)
        {
            IDockContent tab = BuscarFormulario(formulario.Nombre);
            
            if (tab != null) return (FrmDocument)tab;
            else return new FrmDocument(formulario);
        }

        private IDockContent BuscarFormulario(string text)
        {
            foreach (IDockContent content in DockPanel.Documents)
            {
                if (content.DockHandler.TabText == text)
                {
                    return content;
                }
            }
            return null;
        }

        private void OutlookBar_ButtonClicked(object sender, EventArgs e)
        {
            lblModulo.Text = outlookBar.SelectedButton.Text;
            this.LoadArbolByMenuFlexible(Convert.ToByte(outlookBar.SelectedButton.Code));
        }

        private void LoadMenusFlexibles()
        {
            List<Menus> listaMenu = MenusManager.Instancia.ListarPorContenedor(null);
            int index = 1;
            foreach (Menus item in listaMenu)
            {
                if (ExistePermisosByMenu(item.IdMenu))
                {
                    OutlookBarButton botton = new OutlookBarButton(index + 1, item.Nombre, SistemaLogistica.Windows.Properties.Resources.Administracion, item.IdMenu.ToString());
                    outlookBar.Buttons.Add(botton);
                    outlookBar.Height += 40;
                    index += 1;
                }
            }
            if (outlookBar.Buttons.Count > 0)
            {
                outlookBar.Buttons[0].Selected = true;
            }
        }

        private void LoadArbolByMenuFlexible(byte idMenu)
        {
            if (ExistePermisosByMenu(idMenu))
            {
                tvwFormularios.Nodes.Clear();
                tvwFormularios.ImageList = this.ImgLst;
                tvwFormularios.ItemHeight = 25;

                TreeNode tn = new TreeNode(lblModulo.Text);
                tn.ImageIndex = (int)TipoItem.Modulo;
                tn.Tag = idMenu;

                LoadMenusByNodo(tn);
                LoadFormulariosByNodo(tn);
                tvwFormularios.Nodes.Add(tn);
                tvwFormularios.Dock = DockStyle.Fill;
                tvwFormularios.ExpandAll();
            }
        }

        private void LoadMenusByNodo(TreeNode padre)
        {
            List<Menus> listaTemp = default(List<Menus>);
            listaTemp = MenusManager.Instancia.ListarPorContenedor((byte)padre.Tag);

            foreach (Menus itemO in listaTemp)
            {
                if (ExistePermisosByMenu(itemO.IdMenu))
                {
                    TreeNode tnO = new TreeNode(itemO.Nombre);
                    tnO.ImageIndex = (int)TipoItem.Carpeta;
                    tnO.Tag = itemO.IdMenu;
                    tnO.ToolTipText = itemO.Descripcion;

                    LoadMenusByNodo(tnO);
                    LoadFormulariosByNodo(tnO);
                    padre.Nodes.Add(tnO);
                }
            }
        }

        private void LoadFormulariosByNodo(TreeNode padre)
        {
            List<Formulario> listaTemp = default(List<Formulario>);
            listaTemp = FormularioManager.Instancia.ListarPorMenus((byte)padre.Tag);

            foreach (Formulario itemO in listaTemp)
            {
                if (ExistePermisosByFormulario(itemO.IdFormulario))
                {
                    TreeNode tnO = new TreeNode(itemO.Nombre);
                    tnO.ImageIndex = (int)TipoItem.Formulario;
                    tnO.Tag = itemO.IdFormulario;
                    tnO.ToolTipText = itemO.Descripcion;
                    padre.Nodes.Add(tnO);   
                }
            }
        }

        private bool ExistePermisosByMenu(byte idMenu)
        {
            List<Permiso> permisos = new List<Permiso>();
            permisos.AddRange(EmpleadoManager.Instancia.ListarPermisosPorUsuarioYMenuConAcceso(Empresa.Usuario.IdEmpleado, idMenu));
            List<Menus> temp = MenusManager.Instancia.ListarPorContenedor(idMenu);
            foreach (Menus m in temp)
            {
                permisos.AddRange(EmpleadoManager.Instancia.ListarPermisosPorUsuarioYMenuConAcceso(Empresa.Usuario.IdEmpleado, m.IdMenu));
            }
            return permisos.Count > 0 ? true : false;
        }

        private bool ExistePermisosByFormulario(byte idFormulario)
        {
            List<Permiso> temp = EmpleadoManager.Instancia.ListarPermisosPorUsuarioYFormulario(Empresa.Usuario.IdEmpleado, idFormulario);
            Permiso p = temp.Find(t => t.TipoPermiso == 0 && t.Estado);
            if (p != null) return true;
            else return false;
        }
    }
}
